/**
 *
 */
import Util;
import OpenApi;
import OpenApiUtil;
import EndpointUtil;

extends OpenApi;

init(config: OpenApi.Config){
  super(config);
  @endpointRule = 'regional';
  
  checkConfig(config);
  @endpoint = getEndpoint('snapshot', @regionId, @endpointRule, @network, @suffix, @endpointMap, @endpoint);
}

function getEndpoint(productId: string, regionId: string, endpointRule: string, network: string, suffix: string, endpointMap: map[string]string, endpoint: string) throws: string{
  if (!Util.empty(endpoint)) {
    return endpoint;
  }

  if (!Util.isUnset(endpointMap) && !Util.empty(endpointMap[regionId])) {
    return endpointMap[regionId];
  }
  return EndpointUtil.getEndpointRules(productId, regionId, endpointRule, network, suffix);
}
model GetSnapshotBlockRequest {
  clientToken?: string(name='ClientToken', description='幂等参数'),
  blockIndex?: long(name='BlockIndex', description='待读取的数据块索引，从零开始。从 ListChangedBlocks 或者 ListSnapshotBlocks 返回'),
  blockToken?: string(name='BlockToken', description='待读取的数据块Token，从零开始。从 ListChangedBlocks 或者 ListSnapshotBlocks 返回'),
  snapshotId?: string(name='SnapshotId', description='待读取数据的快照名称'),
}

model GetSnapshotBlockResponse = {
  headers: map[string]string(name='headers'),
  body: readable(name='body'),
}

async function getSnapshotBlock(request: GetSnapshotBlockRequest): GetSnapshotBlockResponse {
  var runtime = new Util.RuntimeOptions{};
  var headers : map[string]string = {};
  return getSnapshotBlockWithOptions(request, headers, runtime);
}

async function getSnapshotBlockWithOptions(request: GetSnapshotBlockRequest, headers: map[string]string, runtime: Util.RuntimeOptions): GetSnapshotBlockResponse {
  Util.validateModel(request);
  var query : map[string]any= {};
  if (!Util.isUnset(request.clientToken)) {
    query.ClientToken = request.clientToken;
  }
  if (!Util.isUnset(request.blockIndex)) {
    query.BlockIndex = request.blockIndex;
  }
  if (!Util.isUnset(request.blockToken)) {
    query.BlockToken = request.blockToken;
  }
  if (!Util.isUnset(request.snapshotId)) {
    query.SnapshotId = request.snapshotId;
  }

  var req = new OpenApi.OpenApiRequest{ 
    headers = headers,
    query = OpenApiUtil.query(query),
  };
  var res = new GetSnapshotBlockResponse{};
  var tmp = Util.assertAsMap(doROARequest('GetSnapshotBlock', '2020-11-18', 'HTTPS', 'GET', 'AK', `/snapshots/block`, 'binary', req, runtime));
  if (!Util.isUnset(tmp.body)) {
    var respBody = Util.assertAsReadable(tmp.body);
    res.body = respBody;
  }
  if (!Util.isUnset(tmp.headers)) {
    var respHeaders = Util.assertAsMap(tmp.headers);
    res.headers = Util.stringifyMapValue(respHeaders);
  }
  return res;
}

model GetSnapshotInfoRequest {
  clientToken?: string(name='ClientToken', description='幂等参数'),
  snapshotId?: string(name='SnapshotId', description='待读取数据的快照名称'),
  showDetail?: boolean(name='ShowDetail', description='是否返回详细信息，详细信息需要更多查询时间'),
}

model GetSnapshotInfoResponseBody = {
  volumeSize?: long(name='VolumeSize', description='快照大小，单位 GB，最小 1GB'),
  blockSize?: long(name='BlockSize', description='快照数据快大小，单位 Bytes'),
  blockCount?: long(name='BlockCount', description='快照数据块总数量，包含空数据块'),
  validBlockCount?: long(name='ValidBlockCount', description='快照中非空数据块总数量，仅在 ShowDetail 为 True 时返回'),
  status?: string(name='Status', description='快照状态'),
  createTime?: long(name='CreateTime', description='快照创建UTC时间，单位微妙'),
  encrypted?: boolean(name='Encrypted', description='快照是否为加密快照'),
}

model GetSnapshotInfoResponse = {
  headers: map[string]string(name='headers'),
  body: GetSnapshotInfoResponseBody(name='body'),
}

async function getSnapshotInfo(request: GetSnapshotInfoRequest): GetSnapshotInfoResponse {
  var runtime = new Util.RuntimeOptions{};
  var headers : map[string]string = {};
  return getSnapshotInfoWithOptions(request, headers, runtime);
}

async function getSnapshotInfoWithOptions(request: GetSnapshotInfoRequest, headers: map[string]string, runtime: Util.RuntimeOptions): GetSnapshotInfoResponse {
  Util.validateModel(request);
  var query : map[string]any= {};
  if (!Util.isUnset(request.clientToken)) {
    query.ClientToken = request.clientToken;
  }
  if (!Util.isUnset(request.snapshotId)) {
    query.SnapshotId = request.snapshotId;
  }
  if (!Util.isUnset(request.showDetail)) {
    query.ShowDetail = request.showDetail;
  }

  var req = new OpenApi.OpenApiRequest{ 
    headers = headers,
    query = OpenApiUtil.query(query),
  };
  return doROARequest('GetSnapshotInfo', '2020-11-18', 'HTTPS', 'GET', 'AK', `/snapshots/info`, 'json', req, runtime);
}

model ListChangedBlocksRequest {
  nextToken?: string(name='NextToken', description='标记当前开始读取的位置，置空表示从头开始'),
  maxResults?: long(name='MaxResults', description='本次读取的最大数据记录数量，最小 100，最大 10000'),
  clientToken?: string(name='ClientToken', description='幂等参数'),
  firstSnapshotId?: string(name='FirstSnapshotId', description='待比较的第一个快照名称，最大 64 字节'),
  secondSnapshotId?: string(name='SecondSnapshotId', description='待比较的第二个快照名称，最大 64 字节'),
  startingBlockIndex?: long(name='StartingBlockIndex', description='两个快照比较的起始数据块 index，从零开始'),
}

model ListChangedBlocksResponseBody = {
  nextToken?: string(name='NextToken', description='下一页结果的 token，为空时代表无新增页，最大长度 256 字节'),
  changedBlocks?: [ 
    {
      blockIndex?: long(name='BlockIndex', description='数据块的索引值，从零开始'),
      firstBlockToken?: string(name='FirstBlockToken', description='FirstSnapshotId 中数据块的 Token，用于后续的数据读取，第一个快照未变化时可省略。最大长度 256 字节'),
      secondBlockToken?: string(name='SecondBlockToken', description='SecondBlockToken指定的快照中相对于 FirstBlockIndex 变化的数据块 Token，用于后续读取数据。最大长度 256 字节'),
    }
  ](name='ChangedBlocks', description='两个快照差异的数据块列表'),
  expiryTime?: long(name='ExpiryTime', description='差异数据块 token 过期时间戳'),
  volumeSize?: long(name='VolumeSize', description='第二个快照大小，单位 GB，最小 1GB'),
  blockSize?: long(name='BlockSize', description='数据块大小，单位 Byte'),
  blockCount?: long(name='BlockCount', description='本次查询中变化数据块数量'),
  totalBlockCount?: long(name='TotalBlockCount', description='两个快照差异数据块总数量'),
}

model ListChangedBlocksResponse = {
  headers: map[string]string(name='headers'),
  body: ListChangedBlocksResponseBody(name='body'),
}

async function listChangedBlocks(request: ListChangedBlocksRequest): ListChangedBlocksResponse {
  var runtime = new Util.RuntimeOptions{};
  var headers : map[string]string = {};
  return listChangedBlocksWithOptions(request, headers, runtime);
}

async function listChangedBlocksWithOptions(request: ListChangedBlocksRequest, headers: map[string]string, runtime: Util.RuntimeOptions): ListChangedBlocksResponse {
  Util.validateModel(request);
  var query : map[string]any= {};
  if (!Util.isUnset(request.nextToken)) {
    query.NextToken = request.nextToken;
  }
  if (!Util.isUnset(request.maxResults)) {
    query.MaxResults = request.maxResults;
  }
  if (!Util.isUnset(request.clientToken)) {
    query.ClientToken = request.clientToken;
  }
  if (!Util.isUnset(request.firstSnapshotId)) {
    query.FirstSnapshotId = request.firstSnapshotId;
  }
  if (!Util.isUnset(request.secondSnapshotId)) {
    query.SecondSnapshotId = request.secondSnapshotId;
  }
  if (!Util.isUnset(request.startingBlockIndex)) {
    query.StartingBlockIndex = request.startingBlockIndex;
  }

  var req = new OpenApi.OpenApiRequest{ 
    headers = headers,
    query = OpenApiUtil.query(query),
  };
  return doROARequest('ListChangedBlocks', '2020-11-18', 'HTTPS', 'GET', 'AK', `/snapshots/changedblocks`, 'json', req, runtime);
}

model ListSnapshotBlocksRequest {
  nextToken?: string(name='NextToken', description='标记当前开始读取的位置，置空表示从头开始'),
  maxResults?: long(name='MaxResults', description='本次读取的最大数据记录数量，最小 100， 最大 10000'),
  clientToken?: string(name='ClientToken', description='幂等参数'),
  snapshotId?: string(name='SnapshotId', description='待列出数据块的快照名称'),
  startingBlockIndex?: long(name='StartingBlockIndex', description='列出快照中数据块起始索引值，从零开始'),
}

model ListSnapshotBlocksResponseBody = {
  nextToken?: string(name='NextToken', description='下一页结果的 token，为空时代表无新增页，最大  256 字节'),
  blocks?: [ 
    {
      blockIndex?: long(name='BlockIndex', description='数据块的索引值，从零开始'),
      blockToken?: string(name='BlockToken', description='数据块的 Token，用于后续的数据读取。最大长度 256 字节'),
    }
  ](name='Blocks', description='快照有效数据块信息列表，不包含空数据块'),
  expiryTime?: long(name='ExpiryTime', description='BlockToken 过期时间戳'),
  volumeSize?: long(name='VolumeSize', description='快照大小，单位 GB，最小 1GB'),
  blockSize?: long(name='BlockSize', description='数据块大小，单位 Byte'),
  blockCount?: long(name='BlockCount', description='本次查询中快照有效数据块数量'),
  totalBlockCount?: long(name='TotalBlockCount', description='快照有效数据块总数量'),
}

model ListSnapshotBlocksResponse = {
  headers: map[string]string(name='headers'),
  body: ListSnapshotBlocksResponseBody(name='body'),
}

async function listSnapshotBlocks(request: ListSnapshotBlocksRequest): ListSnapshotBlocksResponse {
  var runtime = new Util.RuntimeOptions{};
  var headers : map[string]string = {};
  return listSnapshotBlocksWithOptions(request, headers, runtime);
}

async function listSnapshotBlocksWithOptions(request: ListSnapshotBlocksRequest, headers: map[string]string, runtime: Util.RuntimeOptions): ListSnapshotBlocksResponse {
  Util.validateModel(request);
  var query : map[string]any= {};
  if (!Util.isUnset(request.nextToken)) {
    query.NextToken = request.nextToken;
  }
  if (!Util.isUnset(request.maxResults)) {
    query.MaxResults = request.maxResults;
  }
  if (!Util.isUnset(request.clientToken)) {
    query.ClientToken = request.clientToken;
  }
  if (!Util.isUnset(request.snapshotId)) {
    query.SnapshotId = request.snapshotId;
  }
  if (!Util.isUnset(request.startingBlockIndex)) {
    query.StartingBlockIndex = request.startingBlockIndex;
  }

  var req = new OpenApi.OpenApiRequest{ 
    headers = headers,
    query = OpenApiUtil.query(query),
  };
  return doROARequest('ListSnapshotBlocks', '2020-11-18', 'HTTPS', 'GET', 'AK', `/snapshots/listblocks`, 'json', req, runtime);
}

